home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / share / pyshared / launchpadbugs / exceptions.py < prev    next >
Text File  |  2008-08-27  |  7KB  |  222 lines

  1. import urllib2
  2. import libxml2
  3.  
  4. from lphelper import unicode_for_libxml2
  5.         
  6. # deactivate error messages from the validation [libxml2.htmlParseDoc]
  7. def noerr(ctx, str):
  8.     pass
  9.  
  10. libxml2.registerErrorHandler(noerr, None)
  11.  
  12. #########################
  13. # Launchpad errors
  14. #########################
  15.  
  16. class LaunchpadError(Exception):
  17.     def __str__(self):
  18.         return "Something went wrong"
  19.         
  20.     def __repr__(self):
  21.         t = self.__class__.__name__
  22.         if t == "LaunchpadError":
  23.             t = ""
  24.         else:
  25.             t = " %s" %t
  26.         return "<LaunchpadError%s>" %t
  27.         
  28.     @property
  29.     def value(self):
  30.         try:
  31.             return self.msg
  32.         except:
  33.             return None
  34.     
  35. class LaunchpadURLError(LaunchpadError, urllib2.URLError):
  36.     def __init__(self, msg, url=None):
  37.         self.msg = msg
  38.         self.url = url
  39.         
  40.     def __str__(self):
  41.         return """
  42.     * message: %s
  43.     * url: %s""" %(self.msg, self.url or "unknown")
  44.         
  45. class LaunchpadInternalServerError(LaunchpadError):
  46.     def __init__(self, url):
  47.         self.url = url
  48.         
  49.     def __str__(self):
  50.         return """
  51.     * message: An internal server error occurred. Please try again later.
  52.     * url: %s""" %self.url
  53.         
  54. class LaunchpadLoginError(LaunchpadError):
  55.     def __init__(self, url, msg=""):
  56.         self.url = url
  57.         self.msg = msg
  58.         
  59.     def __str__(self):
  60.         if self.msg:
  61.             m = " %s" %self.msg.strip()
  62.         else:
  63.             m = ""
  64.         return """
  65.     * message: To continue, you must log in to Launchpad.%s
  66.     * url: %s""" %(m, self.url)
  67.     
  68. class LaunchpadLoginFailed(LaunchpadLoginError):
  69.     def __init__(self, url):
  70.         self.url = url
  71.         
  72.     def __str__(self):
  73.         return """Login failed: The email address and password do not match.
  74.     * url: %s""" %self.url
  75.         
  76. class LaunchpadNotAllowedError(LaunchpadLoginError):
  77.     pass
  78.         
  79.         
  80. ################################
  81. ## python-launchpad-bugs Errors
  82. ################################
  83. class PythonLaunchpadBugsError(Exception):
  84.     def __str__(self):
  85.         return "Something went wrong"
  86.         
  87.     def __repr__(self):
  88.         t = self.__class__.__name__
  89.         if t == "PythonLaunchpadBugsError":
  90.             t = ""
  91.         else:
  92.             t = " %s" %t
  93.         return "<PythonLaunchpadBugsError%s>" %t
  94.         
  95. class PythonLaunchpadBugsValueError(PythonLaunchpadBugsError, ValueError):
  96.     def __init__(self, values={}, url="", msg=""):
  97.         self.values = values
  98.         self.url = url or "unknown"
  99.         self.msg = msg
  100.         
  101.     def __str__(self):
  102.         errors = ""
  103.         msg = ""
  104.         if self.values:
  105.             l = len(self.values)
  106.             if l == 1:
  107.                 errors = "\nThere is %s error\n" %l
  108.             else:
  109.                 errors = "\nThere are %s errors\n" %len(self.values)
  110.             for i, k in self.values.iteritems():
  111.                 errors += "    * %s: %s\n" %(i,k)
  112.             errors.rstrip("\n")
  113.         if self.msg:
  114.             msg = "\n%s" %self.msg
  115.         r = """There is a problem with the information you entered. \
  116.  Please fix it and try again.%s%s""" %(errors, msg)
  117.         return r.rstrip("\n")
  118.         
  119. class PythonLaunchpadBugsIOError(PythonLaunchpadBugsError, IOError):
  120.     def __init__(self, msg):
  121.         self.msg = msg
  122.         
  123.     def __str__(self):
  124.         return self.msg
  125.         
  126. class PythonLaunchpadBugsRuntimeError(PythonLaunchpadBugsError, RuntimeError):
  127.     def __init__(self, msg):
  128.         self.msg = msg
  129.         
  130.     def __str__(self):
  131.         msg = "    * %s" %self.msg.lstrip(" *")
  132.         return """The following error occured while using python-launchpad-bugs. Please report this error with as much information as possible.\n\t%s""" %msg
  133.         
  134. class PythonLaunchpadBugsParsingError(PythonLaunchpadBugsError, AssertionError):
  135.     def __init__(self, path, url=None):
  136.         self.path = path
  137.         self.url = url or "unknown url"
  138.         
  139.     def __str__(self):
  140.         return """Error while parsing %s (%s)""" %(self.path, self.url)
  141.         
  142. class PythonLaunchpadBugsXMLParsingError(PythonLaunchpadBugsParsingError):
  143.     def __init__(self, path, xml, url=None):
  144.         PythonLaunchpadBugsParsingError.__init__(self, path, url)
  145.         self.xml = xml
  146.         
  147.     def __str__(self):
  148.         return """Wrong XPath-Expr while parsing %s (%s)""" %(self.path, self.url)
  149.         
  150.         
  151.          
  152.             
  153.     
  154.  
  155.  
  156. ##################################################################
  157. ## functions
  158. ##################################################################
  159.  
  160. def choose_LaunchpadError(value, url):
  161.     if value == "login failed":
  162.         return LaunchpadLoginError(url)
  163.     elif value == 500:
  164.         return LaunchpadInternalServerError(url)
  165.     elif value == 404:
  166.         return LaunchpadURLError("Page not found", url)
  167.     elif value == 403:
  168.         return LaunchpadNotAllowedError(url)
  169.     else:
  170.         return LaunchpadURLError(value, url)
  171.         
  172.         
  173. UNKNOWNERROR, VALUEERROR, RUNTIMEERROR = range(3)
  174.         
  175.         
  176. def _parse_page(text):
  177.     guess_type = UNKNOWNERROR
  178.     errors = {}
  179.     t = libxml2.htmlParseDoc(unicode_for_libxml2(text), "UTF-8")
  180.     e = t.xpathEval('//tr[@class="error"]')
  181.     for i in e:
  182.         msg = ""
  183.         m = i.xpathEval('td/div[@class="message"]')
  184.         if m:
  185.             msg = m[0].content
  186.         m = i.xpathEval("td/div/input | td/div/textarea")
  187.         assert m
  188.         val = m[0].prop("name")
  189.         errors[val] = msg
  190.     return guess_type, errors
  191.     
  192.         
  193. def choose_pylpbugsError(error_type=UNKNOWNERROR, values={}, text="", url=""):
  194.     errors = {}
  195.     if text:
  196.         guess_type, errors = _parse_page(text)
  197.         if not error_type:
  198.             error_type = guess_type
  199.     values.update(errors)
  200.     if error_type == VALUEERROR:
  201.         return PythonLaunchpadBugsValueError(values, url)
  202.     elif error_type == RUNTIMEERROR and msg:
  203.         return PythonLaunchpadBugsRuntimeError(msg)
  204.     else:
  205.         return PythonLaunchpadBugsError
  206.         
  207. def parse_error(cond, path, xml=None, url="", msg="", error_type=UNKNOWNERROR):
  208.     if not cond:
  209.         if error_type:
  210.             if error_type == VALUEERROR:
  211.                 raise PythonLaunchpadBugsValueError(url=url, msg=msg)
  212.             elif error_type == RUNTIMEERROR and msg:
  213.                 raise PythonLaunchpadBugsRuntimeError(msg)
  214.             else:
  215.                 raise PythonLaunchpadBugsError
  216.         else:
  217.             if xml is None:
  218.                 raise PythonLaunchpadBugsParsingError(path, url)
  219.             else:
  220.                 raise PythonLaunchpadBugsXMLParsingError(path, xml, url)
  221.         
  222.